class Publisher {
  constructor() {
    // 订阅者 依赖存储器 初始化
    this.observers = [];
  }

  // 增加订阅者
  add(observer) {
    this.observers.push(observer);
  }

  // 删除订阅者
  remove(observer) {
    const eq = this.observers.findIndex(observer);
    if (eq) {
      this.observers.splice(eq, 1);
    }
  }

  // 通知订阅者更新
  notify() {
    this.observers.forEach((item) => {
      item?.update(this);
    });
  }
}

class Observer {
  constructor() {
    console.log("订阅者 创建了");
  }

  update() {
    console.log("更新");
  }
}

class PhoneFactory extends Publisher {
  constructor() {
    // 执行继承类的构造函数
    super();
    // 初始化手机 默认是没有
    this.phone = null;
    this.phonePrice = 0;
    // 订阅者列表 存起来用于通知
    this.observers = [];
  }

  // 获取当前的产品名称和价格
  getProduct() {
    return {
      phone: this.phone,
      phonePrice: this.phonePrice,
    };
  }

  // 修改产品信息
  setPrd(phone, phonePrice) {
    this.phone = phone;
    this.phonePrice = phonePrice;
    // 通知订阅者可以购买了
    this.notify();
  }
}

class StudentObserver extends Observer {
  constructor(name, price) {
    super();
    // 订阅者姓名
    this.name = name;
    // 资产
    this.price = price;
    // 当前手机型号
    this.phoneModel = "HUAWEI nova5 pro";
  }

  // update 购买
  update(Publisher) {
    // 更新需求文档
    let foo,
      boo = false;
    foo = Publisher.getProduct();
    if (foo.phonePrice < this.price) {
      // 买得起
      boo = true;
      // 换新手机了，修改手机的参数
      this.price -= foo.phonePrice;
      this.phoneModel = foo.phone;
    }
    // 其他逻辑
    this.run(boo);
  }

  // 执行的逻辑
  run(boo) {
    console.log(
      `${this.name} ${boo ? "购买了新手机" : "存款买不起"}`,
      `存款剩余 ${this.price}`, `当前手机：${this.phoneModel}`
    );
  }
}

// 工厂
const Factory = new PhoneFactory()
// 学生A、B、C
// A同学有一万块钱
const A  = new StudentObserver('A', 10000)
// B同学有四千块钱
const B  = new StudentObserver('B', 4000)
// C同学有两千块钱
const C  = new StudentObserver('C', 2000)
// 学生订阅到工厂
Factory.add(A)
Factory.add(B)
Factory.add(C)

// 工厂发布手机
Factory.setPrd('iphone14 pro max 远峰蓝', 9999)